"""
auth : ginger
    token处理
        param_rsa :  参数加密
        is_login  :  是否登录状态
        signin    :  登录
        headers   :  包含了 cookie 和 token 的 request_headers ( 该变量意义是别的模块直接导入 , 实际只需要登录一次即可 )
"""
from common.do_requests import request
from common.do_rsa_enc import get_rsa_encrypt
from common.do_cookies import get_cookies_to_dict, write_cookies
from common.do_log import do_log
from common.do_conf import username, password


def param_rsa(username_before, password_before, key):
    """
    对参数进行加密
    """
    di = dict()
    rsa_username = get_rsa_encrypt(username_before, key)
    rsa_password = get_rsa_encrypt(password_before, key)

    do_log.info('登录生成参数成功 username : ' + rsa_username)
    do_log.info('登录生成参数成功 password : ' + rsa_password)

    di['username'] = rsa_username
    di['password'] = rsa_password
    di['authenticate'] = 'LDAP'

    do_log.debug('username : ' + rsa_username)
    do_log.debug('password : ' + rsa_password)

    return di


def is_login():
    response_is_login = request(path='/isLogin', method='get', headers=get_cookies_to_dict())
    login_flag = response_is_login.json().get('success')
    result_dict = dict()
    result_dict['success'] = login_flag

    if not login_flag:
        result_dict['msg'] = response_is_login.json().get('message')
        do_log.info('使用配置文件的 Cookie 登录失败')
    else:
        result_dict['msg'] = response_is_login.json().get('data').get('csrfToken')
        do_log.info('使用配置文件的 Cookie 登录成功')

    return result_dict


def signin(username_before, password_before):
    """
    :info
        先调用 is_login() 函数 , 使用配置文件中的 cookie 信息进行登录
        如果登录成功了 , 就返回 cookie 和 token
        如果登录失败了 , 就再次登录 , 姜新的 cookie 写入配置文件 , 返回新的 cookie 和 token
    :return:
        返回 Cookie 和 CSRF-TOKEN 组成的 Headers :
    """
    login_flag = is_login()
    res = login_flag.get('success')
    msg = login_flag.get('msg')
    request_headers = {'accept': '*/*', 'Accept': 'application/json,text/plain,*/*'}

    # 如果使用配置文件中的 cookies 登录成功 ， 则直接返回 msg ， msg 也就是请求头中的 ： "CSRF-TOKEN"
    if res:
        request_headers['Cookie'] = get_cookies_to_dict().get('Cookie')
        request_headers['CSRF-TOKEN'] = msg

        do_log.info('使用配置文件的 Cookie 登录成功')
        do_log.info('原 cookie 和 token 信息 : ' + str(request_headers))
        return request_headers

    # 如果配置文件中的cookies未登录成功 ， 则调用 signin 接口完成登录 ， 并更新配置文件中的 cookies：
    response_signin = \
        request(path='/ldap/signin', method='post', param=param_rsa(username_before, password_before, msg))
    cookie_v = None
    for cookie in response_signin.cookies:
        if cookie.name == 'SESSION':
            cookie_v = cookie.value
    cookies_value = "SESSION=" + cookie_v
    # 姜新的 Cookie 写入 cookies.conf
    write_cookies(cookies_value)
    csrf_token = response_signin.json().get('data').get('csrfToken')
    request_headers['Cookie'] = cookies_value
    request_headers['CSRF-TOKEN'] = csrf_token
    do_log.info('重新登录成功 , 新的 Cookie 已写入配置文件 : ' + cookies_value)
    do_log.info('新的 cookie 和 token 信息 : ' + str(request_headers))
    return request_headers


headers = signin(username_before=username, password_before=password)

if __name__ == '__main__':
    print(headers)
